# Contributor: Jakub Jirutka <jakub@jirutka.cz>
# Maintainer: Jakub Jirutka <jakub@jirutka.cz>
pkgname=reason
pkgver=3.0.4
pkgrel=2
pkgdesc="Simple, fast & type safe code that leverages the JavaScript & OCaml ecosystems"
url="https://reasonml.github.io/"
# x86, armhf, s390x, mips, mips64: limited by ocaml aport
arch="all !x86 !armhf !armv7 !s390x !mips !mips64"
license="MIT"
checkdepends="nodejs utop-full"
_menhirver=20171013
makedepends="
	bash
	dune
	ocaml
	ocaml-compiler-libs
	ocaml-findlib-dev
	ocaml-menhir-dev=~$_menhirver
	ocaml-merlin-extend-dev
	ocaml-migrate-parsetree-dev
	ocaml-ocamlbuild-dev
	ocaml-result-dev
	ocaml-utop-dev
	ocamlbuild
	opam
	"
options="!check"  # FIXME: tests cannot find reason's modules
subpackages="
	ocaml-$pkgname-dev:_libdev
	$pkgname-merlin
	$pkgname-reactjs
	$pkgname-rebuild
	$pkgname-rtop
	ocaml-$pkgname:_lib
	"
source="$pkgname-$pkgver.tar.gz::https://github.com/facebook/$pkgname/archive/$pkgver.tar.gz
	rtop.sh.patch"
builddir="$srcdir/$pkgname-$pkgver"

build() {
	cd "$builddir"
	jbuilder build @install
}

check() {
	cd "$builddir"
	jbuilder runtest
}

package() {
	cd "$builddir"

	opam-installer -i \
		--prefix="$pkgdir/usr" \
		--libdir="$pkgdir/usr/lib/ocaml" \
		--docdir="$pkgdir/doc" \
		--mandir="$pkgdir/usr/share/man" \
		$pkgname.install

	cd "$pkgdir"

	# There's just a readme and changelog.
	rm -Rf doc

	# Remove annotation files and sources.
	find usr/lib/ocaml \
		-name '*.cmt' -delete \
		-o -name '*.cmti' -delete \
		-o -name '*.ml' -delete

	# Just for internal tests.
	rm usr/bin/testOprint

	# This is probably used only to generate parser (?).
	rm usr/bin/menhir_error_processor

	mkdir -p usr/share/$pkgname-rtop
	mv usr/bin/rtop_init.ml usr/share/$pkgname-rtop/
}

_libdev() {
	pkgdesc="$pkgdesc (development files)"
	depends="ocaml-$pkgname=$pkgver-r$pkgrel"
	local sitelib="usr/lib/ocaml/$pkgname"

	cd "$pkgdir"

	local path; for path in $(find $sitelib/ \
		-name '*.a' \
		-o -name '*.cmx' \
		-o -name '*.cmxa' \
		-o -name '*.mli')
	do
		mkdir -p "$subpkgdir"/${path%/*}
		mv "$path" "$subpkgdir"/${path%/*}/
	done
	rmdir "$subpkgdir"/$sitelib 2>/dev/null || true
}

merlin() {
	pkgdesc="Reason extension to Merlin - context sensitive completion"
	depends="ocaml-merlin"

	_submv usr/bin/ocamlmerlin-reason
}

reactjs() {
	pkgdesc="ReactJS interop that translates Reason JSX to JS"

	_submv usr/bin/ppx_react
	_submv usr/bin/reactjs_jsx_ppx_v2
	_submv usr/bin/reactjs_jsx_ppx_v3
}

rebuild() {
	pkgdesc="Simple build system for Reason based on OCamlbuild"
	depends="$pkgname ocaml ocaml-ocamlbuild"

	_submv usr/bin/rebuild
}

rtop() {
	pkgdesc="REPL for Reason based on Utop"
	depends="$pkgname=$pkgver-r$pkgrel
		ocaml-$pkgname=$pkgver-r$pkgrel
		ocaml-menhir-dev=~$_menhirver
		utop-full"

	_submv usr/bin/rtop
	_submv usr/lib/ocaml/$pkgname/rtop
	_submv usr/share/$pkgname-rtop
}

_lib() {
	pkgdesc="$pkgdesc (library)"
	depends="ocaml-runtime ocaml-menhir=~$_menhirver ocaml-migrate-parsetree"

	_submv usr/lib/ocaml/$pkgname
}

_submv() {
	local path="$1"
	mkdir -p "$subpkgdir"/${path%/*}
	mv "$pkgdir"/$path "$subpkgdir"/${path%/*}/
	rmdir -p "$pkgdir"/${path%/*} 2>/dev/null || true
}

sha512sums="ba21920b7320841b08cf0684aeb6718be92b175e2ab71d3b96b317f047c9726b656088cf1a4770766335d4f8a54194b84173e2d7458eabb9e2c0b89a78b1eb95  reason-3.0.4.tar.gz
5a658798a27fa69cc2685353cf0c26dfd95ea6a1d8d5c53c6476500b37b86c18b7b1d26fecac13c5ab0aa91e07f4aa5a7087934e9faca0002dad8f6b8fafd876  rtop.sh.patch"
